//package com.oddfar.campus.business.handler;
//
//import com.alibaba.fastjson2.JSONObject;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Component;
//import org.springframework.web.socket.WebSocketSession;
//
//import javax.annotation.PostConstruct;
//import javax.websocket.*;
//import javax.websocket.server.ServerEndpoint;
//import java.io.IOException;
//import java.net.URLDecoder;
//import java.nio.charset.StandardCharsets;
//import java.util.Map;
//import java.util.concurrent.ConcurrentHashMap;
//
//// 定义 WebSocket 端点，客户端将通过该路径建立 WebSocket 连接
//@ServerEndpoint(value = "/ws/chat")
//// 将该类作为 Spring 组件进行管理
//@Component
//// 使用 Lombok 的日志注解，方便记录日志
//@Slf4j
//public class WebSocketServer {
//
//    // 初始化方法，在 Bean 初始化完成后执行，用于提示 WebSocket 服务已加载
//    @PostConstruct
//    public void init() {
//        log.info("websocket 加载");
//    }
//
//    // 存储每个用户对应的 Session，键为用户 ID，值为 Session 对象
//    private final Map<String, Session> connectedDevices = new ConcurrentHashMap<>();
//
//    /**
//     * 当客户端与服务器建立 WebSocket 连接成功时调用此方法
//     *
//     * @param session 客户端的会话对象
//     */
//    @OnOpen
//    public void onOpen(Session session) {
//        String userId = getUserId(session.getQueryString());
//        if (userId != null) {
//            // 将用户 ID 和对应的 Session 存入 connectedDevices 中
//            connectedDevices.put(userId, session);
//            log.info("用户 {} 已连接", userId);
//        } else {
//            log.warn("无法从查询字符串中获取用户 ID，连接建立失败");
//            try {
//                session.close();
//            } catch (IOException e) {
//                log.error("关闭无效连接时出错", e);
//            }
//        }
//    }
//
//    /**
//     * 当客户端与服务器的 WebSocket 连接关闭时调用此方法
//     *
//     * @param session 客户端的会话对象
//     */
//    @OnClose
//    public void onClose(Session session) {
//        String userId = getUserId(session.getQueryString());
//        if (userId != null) {
//            // 从 connectedDevices 中移除该用户的 Session
//            connectedDevices.remove(userId);
//            log.info("用户 {} 已断开连接", userId);
//        }
//    }
//
//    /**
//     * 当服务器收到客户端发送的消息时调用此方法
//     *
//     * @param message 客户端发送的消息内容
//     * @param session 客户端的会话对象
//     */
//    @OnMessage
//    public void onMessage(String message, WebSocketSession session) {
//        log.info("来自客户端的消息：{}", message);
//        JSONObject jsonObject;
//        try {
//            jsonObject = JSONObject.parseObject(message);
//        } catch (Exception e) {
//            log.error("消息解析失败: {}", message, e);
//            return;
//        }
//        String targetUserId = jsonObject.getString("targetUserId");
//        String senderUserId = getUserId(String.valueOf(session.getUri()));
//        if (targetUserId != null && senderUserId != null) {
//            // 从 connectedDevices 中获取目标用户的 Session
//            log.info("在线信息：{}", connectedDevices.entrySet());
//            Session targetSession = connectedDevices.get(targetUserId);
//            if (targetSession != null && targetSession.isOpen()) {
//                // 向目标用户发送消息
//                sendMessage(targetSession, message);
//            } else {
//                log.warn("目标用户 {} 未连接或会话已关闭", targetUserId);
//            }
//        }
//    }
//
//    /**
//     * 当 WebSocket 连接出现错误时调用此方法
//     *
//     * @param session 客户端的会话对象
//     * @param error   错误信息
//     */
//    @OnError
//    public void onError(Session session, Throwable error) {
//        log.error("发生错误：{}，Session ID：{}", error.getMessage(), session.getId());
//    }
//
//    /**
//     * 向指定客户端会话发送消息
//     *
//     * @param session 客户端的会话对象
//     * @param message 要发送的消息内容
//     */
//    public static void sendMessage(Session session, String message) {
//        try {
//            // 通过会话对象的基本远程端点发送文本消息
//            session.getBasicRemote().sendText(message);
//        } catch (IOException e) {
//            log.error("发送消息出错：{}", e.getMessage());
//        }
//    }
//
//    /**
//     * 从查询字符串中提取用户 ID
//     *
//     * @param query 查询字符串
//     * @return 用户 ID
//     */
//    private String getUserId(String query) {
//        if (query == null) {
//            return null;
//        }
//        try {
//            // 对查询字符串进行 URL 解码
//            query = URLDecoder.decode(query, String.valueOf(StandardCharsets.UTF_8));
//            String[] params = query.split("&");
//            for (String param : params) {
//                String[] keyValue = param.split("=");
//                if (keyValue.length == 2 && keyValue[0].equals("userId")) {
//                    return keyValue[1];
//                }
//            }
//        } catch (Exception e) {
//            log.error("解析查询字符串时出错: {}", query, e);
//        }
//        return null;
//    }
//}